#include <iostream>

using std::cout;
using std::endl;

//声明了纯虚函数的类称为抽象类;
//抽象类是不能创建对象的;
class Base
{
public:
    //只想在基类中声明虚函数，并不想实现,将具体的实现留给儿子
    //纯虚函数
    virtual void print() = 0;
    virtual void display() = 0;
};

//对于抽象类的派生类而言，如果有至少一个纯虚函数没有实现，那么
//抽象类的派生类也是抽象类，也不能创建对象
class Derived
: public Base
{
public:
    virtual void print() override
    {
        cout << "void Derived::print()" << endl;
    }
};

class DerivedSecond
: public Derived
{
public:
    virtual void display() override
    {
        cout << "void DerivedSecond::display()" << endl;
    }
};

class Line;//声明

void test()
{
    /* Base base;//Base是抽象类 */
    cout << endl;
    /* Derived derived;//error,Derived是抽象类，不能创建对象 */
    /* derived.print(); */
    DerivedSecond ds;

    //不能创建抽象类型的对象，能不能创建抽象类型的指针或者引用呢
    Base *pbase = &ds;
    Base &ref = ds;

    Derived *pderived = &ds;
    Derived &ref2 = ds;

    //不完整类型，也不能创建对象，但是可以创建不完整类型的指针
    //或者引用
    /* Line line;//error */
    Line *pline;
}

int main(int argc, char *argv[])
{
    test();
    return 0;
}

